package com.example.java8.feature_05.func_interface;

import java.util.function.IntConsumer;
import java.util.function.IntFunction;
import java.util.function.IntSupplier;

public class TestLambda {

	public static void main(String[] args){
		
		/**
		 * Runnable接口中只包含一个无参数的run()方法
		 * Lambda表达式代表的匿名方法实现了Runnable接口中唯一的、无参数的方法
		 * 因此下面的Lambda表达式创建了一个Runnable对象
		 * */
		Runnable r = () -> {
			for(int i = 0; i < 10; i++){
				System.out.println("---->" + i);
			}
		};
		
		r.run();
		
		/*Object obj = () -> {
			for(int i = 0; i < 10; i++){
				System.out.println("=====" + i);
			}
		};*/
		/**
		 * 以上代码使用Lambda表达式直接给Object赋值，因此编译上面代码会报如下错误：
		 * 不兼容类型:Object不是函数式接口。改下上面代码如下：
		 * */
		Object obj = (Runnable)() -> {
			for(int i = 0; i < 10; i++){
				System.out.println("=====" + i);
			}
		};
		((Runnable) obj).run();
		/**
		 * 上代码对Lambda表达式进行了强制类型转换，这样就可以确定该表达式的目标类型为
		 * Runnable函数式接口
		 * */
		
		/**
		 * 同样的Lambda表达式可以被当成不同的目标类型，唯一的要求是，Lambda表达式实现的匿名方法
		 * 与目标类型(函数式接口)中唯一的抽象方法有相同的形参列表。
		 * */
		Object obj2 = (FkTest)() -> {
			for(int i = 0; i < 10; i++){
				System.out.println("FkTest===" + i);
			}
		};
		((FkTest) obj2).run();
		
		/*int val = 5;
		String result = testIntFunction(val, (value) -> {
			return "1234" + value;
		});
		System.out.println(result);
		
		IntFunction<String> intfStr = (value) -> {
			return "";
		};*/
		testIntFunction();
		testIntConsumer();
		testIntSupplier();
	}
	
	public static void testIntFunction(){
		IntFunction<String> intf = (value) -> {
			String str = "deleerhai";
			if(value == 5){
				return str;
			}else{
				return "huangxiaohei";
			}
		};
		System.out.println(intf.apply(5));
	}
	
	public static void testIntConsumer(){
		IntConsumer intcon1 = (value) -> {
			System.out.println("你大爷deleerhai代号:" + value);
		};
		intcon1.accept(9527);
		/*
		 * 简写形式
		 * */
		IntConsumer intcon2 = (value) -> System.out.println("你大爷deleerhai代号:" + value);
		intcon2.accept(9527);
	}
	
	public static void testIntSupplier(){
		IntSupplier intsup1 = () -> {
			return 18;
		};
		System.out.println("哥年年" + intsup1.getAsInt() + "岁");
		/*
		 * 简写形式
		 * */
		IntSupplier intsup2 = () -> 18;
		System.out.println("哥年年" + intsup2.getAsInt() + "岁");
	}
}
